require('dotenv').config();
const jwt = require('jsonwebtoken');
const User = require('../models/User');

/**
 * 认证中间件，用于验证用户身份
 * @param {Object} ctx - Koa上下文对象
 * @param {Function} next - 下一个中间件函数
 */
const authMiddleware = async (ctx, next) => {
  try {
    // 获取Authorization头
    const authorizationHeader = ctx.headers.authorization;
    
    // 检查Authorization头是否存在
    if (!authorizationHeader) {
      ctx.status = 401;
      ctx.body = { message: '未提供认证令牌' };
      return;
    }
    
    // 从Authorization头中提取令牌
    const token = authorizationHeader.split(' ')[1];
    
    if (!token) {
      ctx.status = 401;
      ctx.body = { message: '无效的认证令牌' };
      return;
    }
    
    // 验证令牌
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    
    // 检查用户是否存在
    const user = await User.findById(decoded.id);
    
    if (!user) {
      ctx.status = 401;
      ctx.body = { message: '用户不存在' };
      return;
    }
    
    // 将用户信息存储在ctx.state中，供后续中间件和控制器使用
    ctx.state.user = {
      id: user.id,
      email: user.email,
      username: user.username
    };
    
    // 继续执行下一个中间件或路由处理器
    await next();
  } catch (error) {
    // 处理各种可能的错误
    if (error.name === 'JsonWebTokenError') {
      ctx.status = 401;
      ctx.body = { message: '无效的令牌' };
    } else if (error.name === 'TokenExpiredError') {
      ctx.status = 401;
      ctx.body = { message: '令牌已过期' };
    } else {
      ctx.status = 500;
      ctx.body = { message: '认证过程中发生错误' };
    }
  }
};

module.exports = authMiddleware;